package linkedlist

import "fmt"

// List 表示一个可以保存任何支持比较类型的值的单链表。
type List[T comparable] struct {
	next *List[T]
	val  T
}

// Add 向链表尾部添加一个新节点
func (l *List[T]) Add(value T) {
	newNode := &List[T]{val: value}
	lastNode := l.getLastNode()
	if lastNode == nil {
		l.next = newNode
	} else {
		lastNode.next = newNode
	}
}

// Delete 删除链表中第一个值等于给定值的节点
func (l *List[T]) Delete(value T) {
	if l.next == nil {
		return
	}
	if l.next.val == value {
		l.next = l.next.next
		return
	}
	current := l.next
	for current.next != nil && current.next.val != value {
		current = current.next
	}
	if current.next != nil {
		current.next = current.next.next
	}
}

// ListAll 列出链表中所有节点的值
func (l *List[T]) ListAll() {
	current := l.next
	for current != nil {
		fmt.Print(current.val, " ")
		current = current.next
	}
	fmt.Println()
}

// getLastNode 获取链表的最后一个节点
func (l *List[T]) getLastNode() *List[T] {
	current := l
	for current.next != nil {
		current = current.next
	}
	if current == l {
		return nil
	}
	return current
}

func main() {
	// 创建一个新的链表
	list := &List[int]{}

	// 添加节点
	list.Add(3)
	list.Add(4)
	list.Add(6)

	// 列出所有节点
	fmt.Print("初始链表: ")
	list.ListAll()

	// 删除节点
	list.Delete(4)

	// 再次列出所有节点
	fmt.Print("删除节点 2 后的链表: ")
	list.ListAll()
}
